// 加密 采用对称加密模拟一下 实际开发中肯定是用非对称加密
function jiaMi(key) {
    // 简单位运算
    return key << 1
}
// 解密
function jieMi(key) {
    return key >> 1
}

// 获取私有属性
// 用一个函数的闭包保存私有属性，返回用Symbol加工过的对象
// 返回一个函数，校验使用者是否安全，选择性的返回Symbol
function getObj() {
    let s1 = Symbol('1')
    let s2 = Symbol('1')
    let obj = {}
    obj[s1] = '这是机密文件！'
    return {
        obj: obj,
        getKey: function (key) {
            // 加密原理
            if (jiaMi(key) === '2468' * 1) {
                return s1
            }
        }
    }
}

let o = getObj()
let key = o.getKey(1234)
console.log(o.obj[key]) // 拿到机密文件

let k1 = Symbol('k')
let k2 = Symbol.for('k')
let k3 = Symbol.for('k')
console.log(k1 == k2, k2 == k3) // false true

console.log(Symbol.keyFor(k1), Symbol.keyFor(k2)) // undefined 'k'

console.log('===================');
console.log('以下就是Set的结构演示');
console.log('===================');

let s = new Set()
// 添加元素
s.add(1)
s.add(1)
s.add(2)
console.log(s) // {1,2}

// 传统的数组去重方法
function quChong(arr) {
    let result = []
    arr.forEach(item => {
        if (!result.includes(item)) {
            result.push(item)
        }
    })
    return result
}

let arrr = [1, 2, 3, 1, 4, 5, 1, 2]
console.log(quChong(arrr)) // [1,2,3,4,5]

// 使用Set去重：
console.log([...new Set(arrr)]) // [1,2,3,4,5]

// 删除元素
s.delete(2)

// 清空所有元素
s.clear()

let ss = new Set([1, 3, 4, 5, 6])
// 查询元素
console.log(ss.has(3)) // true

// 使用class封装一个MySet
class MySet {
    constructor(arr = []) {
        this.size = arr.length
    }
    add() {

    }
    delete() {

    }
    has() {

    }
    clear() {

    }
    forEach() {

    }
}

// Map相关
console.log('===============');
console.log('以下是Map结构演示');
console.log('===============');

const wang = {
    name: '王二麻子',
    age: 18
}

const li = {
    name: '李二牛',
    age: 20
}

const wife1 = {
    prop: '清纯少女'
}

const wife2 = {
    prop: '风雅御姐'
}

// 上述两个对象分别要关联两个老婆 使用Map来关联
let m = new Map()

m.set(wang, wife1)
m.set(li, wife2)

// 查询
console.log(m.get(wang)) // {prop: '清纯少女'}
console.log(m.get(li)) // {prop: '风雅御姐'}
console.log(m.get(123)) // undefined